/* this belongs in include/asm, but there doesn't seem to be a suitable place */
void arch_domain_destroy(struct domain *d)
{
- BUG_ON(d->arch.mm->pgd != NULL);
- if (d->arch.mm != NULL)
- xfree(d->arch.mm);
+ BUG_ON(d->arch.mm.pgd != NULL);
if (d->shared_info != NULL)
free_xenheap_page(d->shared_info);
goto fail_nomem;
d->arch.sys_pgnr = 0;
- if ((d->arch.mm = xmalloc(struct mm_struct)) == NULL)
- goto fail_nomem;
- memset(d->arch.mm, 0, sizeof(*d->arch.mm));
+ memset(&d->arch.mm, 0, sizeof(d->arch.mm));
d->arch.physmap_built = 0;
- if ((d->arch.mm->pgd = pgd_alloc(d->arch.mm)) == NULL)
+ if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
goto fail_nomem;
printf ("arch_domain_create: domain=%p\n", d);
return 0;
fail_nomem:
- if (d->arch.mm->pgd != NULL)
- pgd_free(d->arch.mm->pgd);
- if (d->arch.mm != NULL)
- xfree(d->arch.mm);
+ if (d->arch.mm.pgd != NULL)
+ pgd_free(d->arch.mm.pgd);
if (d->shared_info != NULL)
free_xenheap_page(d->shared_info);
return -ENOMEM;
static void
relinquish_mm(struct domain* d)
{
- struct mm_struct* mm = d->arch.mm;
+ struct mm_struct* mm = &d->arch.mm;
unsigned long i;
pgd_t* pgd;
static pte_t*
lookup_alloc_domain_pte(struct domain* d, unsigned long mpaddr)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
static pte_t*
lookup_noalloc_domain_pte(struct domain* d, unsigned long mpaddr)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
static pte_t*
lookup_noalloc_domain_pte_none(struct domain* d, unsigned long mpaddr)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
static void
zap_domain_page_one(struct domain *d, unsigned long mpaddr, int do_put_page)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pte_t *pte;
pte_t old_pte;
unsigned long mfn;
assign_domain_page_replace(struct domain *d, unsigned long mpaddr,
unsigned long mfn, unsigned int flags)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pte_t* pte;
pte_t old_pte;
return GNTST_general_error;//XXX GNTST_bad_pseudo_phys_addr
// update pte
- old_pte = ptep_get_and_clear(d->arch.mm, gpaddr, pte);
+ old_pte = ptep_get_and_clear(&d->arch.mm, gpaddr, pte);
if (pte_present(old_pte)) {
old_mfn = pte_pfn(old_pte);//XXX
}
/* Flush cache of domain d. */
void domain_cache_flush (struct domain *d, int sync_only)
{
- struct mm_struct *mm = d->arch.mm;
+ struct mm_struct *mm = &d->arch.mm;
pgd_t *pgd = mm->pgd;
unsigned long maddr;
int i,j,k, l;
extern void panic_domain(struct pt_regs *, const char *, ...)
__attribute__ ((noreturn, format (printf, 2, 3)));
+struct mm_struct {
+ pgd_t * pgd;
+ // atomic_t mm_users; /* How many users with user space? */
+};
+
struct arch_domain {
- struct mm_struct *mm;
+ struct mm_struct mm;
unsigned long metaphysical_rr0;
unsigned long metaphysical_rr4;
struct arch_vmx_struct arch_vmx; /* Virtual Machine Extensions */
};
-//#define thread arch._thread
-
-// FOLLOWING FROM linux-2.6.7/include/sched.h
-
-struct mm_struct {
- pgd_t * pgd;
- // atomic_t mm_users; /* How many users with user space? */
-};
-
-extern struct mm_struct init_mm;
-
struct page_info * assign_new_domain_page(struct domain *d, unsigned long mpaddr);
void assign_new_domain0_page(struct domain *d, unsigned long mpaddr);
void __assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long physaddr);